package org.zengrong.utils {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.display.Loader;
	import flash.events.Event;
	import flash.geom.Rectangle;
	import flash.utils.ByteArray;

	/**
	 * 图片数据转换
	 * 根据自定义方法转换byteArray
	 * 及还原图片Bitmap
	 * 
	 */	
	public class ImageDecoder {
		private var _loader:Loader = new Loader();
		public var loading:Boolean;

		/**
		 * 将载入的ByteArray转换成BitmapData。
		 * @param 图片文件载入完,作为回调函数参数。
		 */
		public function ImageDecoder($byte:ByteArray, $callBack:Function){
			loading = true;
			_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(evt:Event):void {
					loading = false;
					$callBack.call(null, Bitmap(evt.target.content));
			});
			_loader.loadBytes($byte);
		}

		/**
		 * 将可视的BitmapData对象数据转换为ByteArray数组，
		 * @param target 
		 */		
		public static function BitmapDataToByteArray(target:DisplayObject):ByteArray {
			var imageWidth:uint = target.width;
			var imageHeight:uint = target.height;
			
			/**将组件读取为BitmapData对象，bitmagData的数据源*/ 
			var srcBmp:BitmapData = new BitmapData(imageWidth, imageHeight);
			srcBmp.draw(target);
			
			/**使用getPixels读取对象的byte数据*/ 
			var pixels:ByteArray = srcBmp.getPixels(new Rectangle(0, 0, imageWidth, imageHeight));
			pixels.writeShort(imageHeight); 
			pixels.writeShort(imageWidth);
			return pixels;
		}

		/**
		 * 此方法返回的Bitmap可以直接赋值给Image的source属性 
		 * @param byArr
		 * @return Bitmap
		 */		
		public static function ByteArrayToBitmap(byArr:ByteArray):Bitmap {
			if (byArr == null){
				return null;
			}
			/**读取出存入时图片的高和宽,因为是最后存入的数据,所以需要到尾部读取*/ 
			var bmd:ByteArray = byArr;
			bmd.position = bmd.length - 2;		  //宽
			var imageWidth:int = bmd.readShort();
			bmd.position = bmd.length - 4;        //高
			var imageHeight:int = bmd.readShort();
			
			var copyBmp:BitmapData = new BitmapData(imageWidth, imageHeight, true);
			
			/**
			 * 利用setPixel方法给图片中的每一个像素赋值,做逆操作 readUnsignedInt()读取一个无符号的 32 位整数。
			 * ByteArray数组从零开始存储一直到最后都是图片数据，读入时的高和宽都是一样的
			 */
			bmd.position = 0;
			for (var i:uint = 0; i < imageHeight; i++){
				for (var j:uint = 0; j < imageWidth; j++){
					copyBmp.setPixel(j, i, bmd.readUnsignedInt());
				}
			}
			var bmp:Bitmap = new Bitmap(copyBmp);
			return bmp;
		}
	}
}